use anyhow::Result;
use colored::*;
use std::process::Command;

pub fn run() -> Result<()> {
    println!("{}", "🔄 正在生成 changelog...".blue());

    // 检查 git-cliff 是否安装
    let output = Command::new("git-cliff").arg("--version").output();

    if output.is_err() {
        println!(
            "{}",
            "❌ git-cliff 未安装，请先运行: cargo install git-cliff".red()
        );
        return Ok(());
    }

    // 生成 changelog
    let status = Command::new("git-cliff")
        .arg("--output")
        .arg("CHANGELOG.md")
        .status()?;

    if status.success() {
        println!("{}", "✅ Changelog 已成功生成到 CHANGELOG.md".green());
        println!("{}", "📋 你可以查看生成的变更日志并进行必要的调整".yellow());
    } else {
        println!("{}", "❌ 生成 changelog 失败".red());
    }

    Ok(())
}

pub fn run_preview() -> Result<()> {
    println!("{}", "🔍 预览最新的变更...".blue());

    let output = Command::new("git-cliff").arg("--unreleased").output()?;

    if output.status.success() {
        let preview = String::from_utf8_lossy(&output.stdout);
        println!("{}", preview);
    } else {
        println!("{}", "❌ 预览 changelog 失败".red());
    }

    Ok(())
}

pub fn run_with_tag(tag: &str) -> Result<()> {
    println!(
        "{}",
        format!("🏷️  正在生成到标签 {} 的 changelog...", tag).blue()
    );

    let status = Command::new("git-cliff")
        .arg("--tag")
        .arg(tag)
        .arg("--output")
        .arg("CHANGELOG.md")
        .status()?;

    if status.success() {
        println!("{}", "✅ Changelog 已成功生成".green());
    } else {
        println!("{}", "❌ 生成 changelog 失败".red());
    }

    Ok(())
}
